home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / intuisup.lha / Intuisup / source.lha / Editor / save.c < prev    next >
C/C++ Source or Header  |  1992-10-05  |  9KB  |  382 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Torsten Jürgeleit
  4.  *
  5.  *    Name .....: save.c
  6.  *    Created ..: Sunday 22-Dec-91 21:23:04
  7.  *    Revision .: 2
  8.  *
  9.  *    Date        Author                 Comment
  10.  *    =========   ====================   ====================
  11.  *    02-Oct-92   Michael Bjerking       New realese, better Screen/Window editor
  12.  *    31-Dec-91   Torsten Jürgeleit      new font management
  13.  *    22-Dec-91   Torsten Jürgeleit      Created this file!
  14.  *
  15.  ****************************************************************************
  16.  *
  17.  *    Save ISUP files
  18.  *
  19.  * $Revision Header ********************************************************/
  20.  
  21.  /* Includes */
  22.  
  23. #include "includes.h"
  24. #include "defines.h"
  25. #include "imports.h"
  26. #include "protos.h"
  27.  
  28.  /* Save project */
  29.  
  30. SHORT
  31. save_project(VOID)
  32. {
  33.     struct rtFileRequester *freq = project_file_requester;
  34.     SHORT status = EDITOR_STATUS_NORMAL;
  35.     BYTE filename[256], buf[256];        /* <- should define a constant */
  36.  
  37.     /* Display ReqTools file requester and check if user selected cancel */
  38.     IChangeMousePointer(ewin, NULL, FALSE);
  39.  
  40.     if (rtFileRequest(freq, filename, PROJECT_SAVE_HAIL_TEXT, TAG_END))
  41.     {
  42.         struct TemplateList *tl = &template_list;
  43.         FILE *fh;                /* BPTR  fh; */
  44.         SHORT len = strlen(filename) - 4;
  45.  
  46.         /* Prepare file name and project name */
  47.         if (len < 1 || strcmp(filename + len, ".tpl"))
  48.         {
  49.             strcat(filename, ".tpl");
  50.             len += 4;
  51.         }
  52.  
  53.         /* filename = path + name */
  54.         if (strlen(freq->Dir) > 0)
  55.         {
  56.             strcpy(buf, filename);
  57.             if (strncmp(buf + strlen(buf) - 1, ":", (size_t) 1) == 0)
  58.                 sprintf(filename, "%s/%s", freq->Dir, buf);
  59.             else
  60.                 sprintf(filename, "%s%s", freq->Dir, buf);
  61.         }
  62.  
  63.         change_project_name(tl, filename, len);
  64.  
  65.         /* Check if file already exists and inform user */
  66.         if (fh = fopen(filename, "r"))
  67.             fclose(fh);
  68.  
  69.         if (!fh || ok_cancel_requester(" Save ", "File already exists.\\n\\n"
  70.                                        "Do you really want to overwrite?") == TRUE)
  71.         {
  72.  
  73.             /* Open file and write project data */
  74.             if (!(fh = fopen(filename, "w+")))
  75.             {
  76.                 status = EDITOR_ERROR_OPEN_FAILED;
  77.             }
  78.             else
  79.             {
  80.                 if ((status = write_project_header(fh, tl)) ==
  81.                     EDITOR_STATUS_NORMAL)
  82.                 {
  83.                     if ((status = write_project_fonts(fh, tl)) ==
  84.                         EDITOR_STATUS_NORMAL)
  85.                     {
  86.                         status = write_project_templates(fh, tl);
  87.                     }
  88.                 }
  89.                 fclose(fh);
  90.  
  91.                 /* If any error then delete incomplete project file */
  92.                 if (status != EDITOR_STATUS_NORMAL)
  93.                 {
  94.                     DeleteFile(filename);
  95.                 }
  96.                 else
  97.                 {
  98.                     tl->tl_Flags &= ~TEMPLATE_LIST_FLAG_CHANGED;
  99.                 }
  100.             }
  101.         }
  102.     }
  103.     IRestoreMousePointer(ewin);
  104.     if (status != EDITOR_STATUS_NORMAL)
  105.     {
  106.         show_error(status);
  107.     }
  108.     return (status);
  109. }
  110.  
  111.  /* Write project header to save file */
  112.  
  113. STATIC SHORT
  114. write_project_header(FILE * fh, struct TemplateList * tl)
  115. {
  116.     SHORT status;
  117.  
  118.     if (fprintf(fh,
  119.                 "\n\t/* Project: %s */\n\n"
  120.                 "BEGIN PROJECTHEADER\n"
  121.                 "   LEFTEDGE=%d\n"
  122.                 "   TOPEDGE=%d\n"
  123.                 "   WIDTH=%d\n"
  124.                 "   HEIGHT=%d\n"
  125.                 "   MINW=%d\n"
  126.                 "   MINH=%d\n"
  127.                 "   MAXW=%d\n"
  128.                 "   MAXH=%d\n"
  129.                 "   DETAILPEN=%d\n"
  130.                 "   BLOCKPEN=%d\n"
  131.                 "   FLAGS=%d\n"
  132.                 "   WINFLAGS=%d\n"
  133.                 "   IDCMPFLAGS=%d\n"
  134.                 "   ID=\"%s\"\n"
  135.                 "   NAME=\"%s\"\n"
  136.                 "END PROJECTHEADER\n",
  137.                 &tl->tl_ProjectName[0],
  138.                 pwin->LeftEdge,
  139.                 pwin->TopEdge,
  140.                 pwin->Width,
  141.                 pwin->Height,
  142.                 pwin->MinWidth,
  143.                 pwin->MinHeight,
  144.                 pwin->MaxWidth,
  145.                 pwin->MaxHeight,
  146.                 pwin->DetailPen,
  147.                 pwin->BlockPen,
  148.                 tl->tl_Flags,
  149.                 pwin->Flags,
  150.                 tl->tl_IDCMPFlags,
  151.                 &tl->tl_ProjectID[0],
  152.                 &tl->tl_ProjectWinName[0]) == -1L)
  153.     {
  154.         status = EDITOR_ERROR_WRITE_FAILED;
  155.     }
  156.     else
  157.         status = EDITOR_STATUS_NORMAL;
  158.  
  159.     return (status);
  160. }
  161.  
  162.  /* Write all template fonts to save file */
  163.  
  164. STATIC SHORT
  165. write_project_fonts(FILE * fh, struct TemplateList * tl)
  166. {
  167.     struct TemplateFont *tf;
  168.     USHORT count = 0;
  169.     SHORT status = EDITOR_STATUS_NORMAL;
  170.  
  171.     for (count = 0, tf = get_head((struct List *) & tl->tl_Fonts);
  172.          tf && status == EDITOR_STATUS_NORMAL; count++,
  173.          tf = get_succ((struct Node *) & tf->tf_MinNode))
  174.     {
  175.         struct TextAttr *ta = &tf->tf_TextAttr;
  176.  
  177.         if (fprintf(fh, "\n\t/* Font %d */\n\n"
  178.                     "BEGIN FONT\n"
  179.                     "   NAME=\"%s\"\n"
  180.                     "   YSIZE=%d\n"
  181.                     "END FONT\n", count, ta->ta_Name, ta->ta_YSize) == -1L)
  182.         {
  183.             status = EDITOR_ERROR_WRITE_FAILED;
  184.         }
  185.     }
  186.     return (status);
  187. }
  188.  
  189.  /* Write all templates to save file */
  190.  
  191. STATIC SHORT
  192. write_project_templates(FILE * fh, struct TemplateList * tl)
  193. {
  194.     struct Template *tp;
  195.     UBYTE count;
  196.     SHORT status = EDITOR_STATUS_NORMAL;
  197.  
  198.     for (count = 0, tp = get_head((struct List *) & tl->tl_Templates);
  199.          tp && status == EDITOR_STATUS_NORMAL;
  200.          count++, tp = get_succ(&tp->tp_Node))
  201.     {
  202.         struct Box *box = &tp->tp_Box;
  203.         UBYTE type = tp->tp_Type;
  204.  
  205.         /* Write standard data */
  206.         if (fprintf(fh, "\n\t/* Template %d: %s */\n\n"
  207.                     "BEGIN TEMPLATE\n"
  208.                     "   NAME=\"%s\"\n"
  209.                     "   TYPE=%d\n"
  210.                     "   FLAGS=%d\n"
  211.                     "   BEGIN BOX\n"
  212.                     "      X1=%d\n"
  213.                     "      Y1=%d\n"
  214.                     "      X2=%d\n"
  215.                     "      Y2=%d\n"
  216.                     "   END BOX\n", count, template_type_text_array[type],
  217.                     &tp->tp_TemplateName[0], type, tp->tp_Flags, box->bo_X1,
  218.                     box->bo_Y1, box->bo_X2, box->bo_Y2) == -1L)
  219.         {
  220.             status = EDITOR_ERROR_WRITE_FAILED;
  221.         }
  222.         else
  223.         {
  224.  
  225.             /* Write text list if any */
  226.             if (type == TEMPLATE_TYPE_MX || type == TEMPLATE_TYPE_CYCLE ||
  227.                 type == TEMPLATE_TYPE_LISTVIEW)
  228.             {
  229.                 if (fprintf(fh, "   BEGIN TEXTLIST\n") == -1L)
  230.                 {
  231.                     status = EDITOR_ERROR_WRITE_FAILED;
  232.                 }
  233.                 else
  234.                 {
  235.                     struct Node *node;
  236.  
  237.                     for (node = get_head(&tp->tp_TextList); node &&
  238.                          status == EDITOR_STATUS_NORMAL; node = get_succ(node))
  239.                     {
  240.                         if (fprintf(fh, "      TEXT=\"%s\"\n",
  241.                                     node->ln_Name) == -1L)
  242.                         {
  243.                             status = EDITOR_ERROR_WRITE_FAILED;
  244.                         }
  245.                     }
  246.                     if (status == EDITOR_STATUS_NORMAL)
  247.                     {
  248.                         if (fprintf(fh, "   END TEXTLIST\n") == -1L)
  249.                         {
  250.                             status = EDITOR_ERROR_WRITE_FAILED;
  251.                         }
  252.                     }
  253.                 }
  254.             }
  255.  
  256.             /* Write template data */
  257.             if (status == EDITOR_STATUS_NORMAL)
  258.             {
  259.                 struct BorderData *bd;
  260.                 struct TextData *td;
  261.                 struct GadgetData *gd;
  262.                 BYTE *fmt;
  263.  
  264.                 switch (TEMPLATE_GROUP(tp))
  265.                 {
  266.                 case TEMPLATE_GROUP_BORDER:
  267.  
  268.                     /* Write border data */
  269.                     bd = &tp->tp_Data.tp_BorderData;
  270.                     if (fprintf(fh,
  271.                                 "   BEGIN BORDERDATA\n"
  272.                                 "      TYPE=%d\n"
  273.                                 "   END BORDERDATA\n", bd->bd_Type) == -1L)
  274.                     {
  275.                         status = EDITOR_ERROR_WRITE_FAILED;
  276.                     }
  277.                     break;
  278.  
  279.                 case TEMPLATE_GROUP_TEXT:
  280.  
  281.                     /* Write text data */
  282.                     td = &tp->tp_Data.tp_TextData;
  283.                     if (td->td_Type == TEXT_DATA_TYPE_TEXT)
  284.                     {
  285.                         fmt = "   BEGIN TEXTDATA\n"
  286.                             "      TYPE=%d\n"
  287.                             "      FLAGS=%d\n"
  288.                             "      TEXT=\"%s\"\n"
  289.                             "      TEXTATTR=%d\n"
  290.                             "   END TEXTDATA\n";
  291.                     }
  292.                     else
  293.                     {
  294.                         fmt = "   BEGIN TEXTDATA\n"
  295.                             "      TYPE=%d\n"
  296.                             "      FLAGS=%d\n"
  297.                             "      TEXT=%ld\n"
  298.                             "      TEXTATTR=%d\n"
  299.                             "   END TEXTDATA\n";
  300.                     }
  301.                     if (fprintf(fh, fmt, td->td_Type, td->td_Flags,
  302.                                 td->td_Text, get_template_font_num(tl,
  303.                                                                    td->td_TextAttr)) == -1L)
  304.                     {
  305.                         status = EDITOR_ERROR_WRITE_FAILED;
  306.                     }
  307.                     break;
  308.  
  309.                 case TEMPLATE_GROUP_GADGET:
  310.  
  311.                     /* Write gadget data */
  312.                     gd = &tp->tp_Data.tp_GadgetData;
  313.                     if (fprintf(fh,
  314.                                 "   BEGIN GADGETDATA\n"
  315.                                 "      TYPE=%ld\n"
  316.                                 "      FLAGS=%ld\n", gd->gd_Type,
  317.                                 gd->gd_Flags) == -1L)
  318.                     {
  319.                         status = EDITOR_ERROR_WRITE_FAILED;
  320.                     }
  321.                     else
  322.                     {
  323.                         if (!gd->gd_Text)
  324.                         {
  325.                             fmt = "      TEXT=%ld\n";
  326.                         }
  327.                         else
  328.                         {
  329.                             fmt = "      TEXT=\"%s\"\n";
  330.                         }
  331.                         if (fprintf(fh, fmt, gd->gd_Text) == -1L)
  332.                         {
  333.                             status = EDITOR_ERROR_WRITE_FAILED;
  334.                         }
  335.                         else
  336.                         {
  337.                             if (gd->gd_Type == GADGET_DATA_TYPE_STRING)
  338.                             {
  339.                                 fmt = "      TEXTATTR=%d\n"
  340.                                     "      SPECIAL1=%ld\n"
  341.                                     "      SPECIAL2=%ld\n"
  342.                                     "      SPECIAL3=\"%s\"\n";
  343.                             }
  344.                             else
  345.                             {
  346.                                 fmt = "      TEXTATTR=%d\n"
  347.                                     "      SPECIAL1=%ld\n"
  348.                                     "      SPECIAL2=%ld\n"
  349.                                     "      SPECIAL3=%ld\n";
  350.                             }
  351.                             if (fprintf(fh, fmt, get_template_font_num(tl,
  352.                                                                        gd->gd_TextAttr),
  353.                                         gd->gd_SpecialData.gd_Data.gd_Data1,
  354.                                         gd->gd_SpecialData.gd_Data.gd_Data2,
  355.                                         gd->gd_SpecialData.gd_Data.gd_Data3) == -1L)
  356.                             {
  357.                                 status = EDITOR_ERROR_WRITE_FAILED;
  358.                             }
  359.                             else
  360.                             {
  361.                                 if (fprintf(fh, "   END GADGETDATA\n") == -1L)
  362.                                 {
  363.                                     status = EDITOR_ERROR_WRITE_FAILED;
  364.                                 }
  365.                             }
  366.                         }
  367.                     }
  368.                     break;
  369.                 }
  370.             }
  371.             if (status == EDITOR_STATUS_NORMAL)
  372.             {
  373.                 if (fprintf(fh, "END TEMPLATE\n") == -1L)
  374.                 {
  375.                     status = EDITOR_ERROR_WRITE_FAILED;
  376.                 }
  377.             }
  378.         }
  379.     }
  380.     return (status);
  381. }
  382.